go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型 |
您所在的位置:网站首页 › go 语言 deadlock › go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型 |
go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型
1. select
1.1 select 概述
select是一个关键字。 select用于监听数据在channel上的流动 select监听channel是异步机制。 语法: select { case for { select { case num := for { select { case num := ch for { select { case num := // 加锁 mutex.Lock() for _, ch := range str { fmt.Printf("%c", ch) time.Sleep(time.Millisecond * 300) } // 解锁 mutex.Unlock() } func user1() { printer("hello") } func user2() { printer("world") } func main() { go user1() go user2() for { ; } } 3.2 读写锁特性 读操作可以同时共享访问,写操作要互斥访问。写锁优先级高(读锁和写锁同时要加锁时,写锁先加)注意:不会抢占锁只有一把,有两种属性(r/w) 定义以及使用 // 创建读写锁对象 var rwMutex RWMutex // 写锁 func (rw *RWMutex) Lock() func (rw *RWMutex) Unlock() // 读锁 func (rw *RWMutex) RLock() func (rw *RWMutex) RUnlock() var count int var rwLock sync.RWMutex func readGo(index int) { for { rwLock.RLock() fmt.Printf("----%d----读:%d\n", index, count) rwLock.RUnlock() time.Sleep(time.Millisecond * 300) } } func writeGo(index int) { for { num := rand.Intn(500) rwLock.Lock() count = num fmt.Printf("----%d----写:%d\n", index, count) rwLock.Unlock() time.Sleep(time.Millisecond * 400) } } func main() { rand.Seed(time.Now().UnixNano()) for i := 0; i go writeGo(i + 1) } for { runtime.GC() // 防止被编译器优化掉空循环 } } 4. 条件变量条件变量要和锁一起使用 type Cond struct { // 在观测或更改条件时L会冻结 L Locker // 包含隐藏或非导出字段 }wait方法 func (c *Cond) Wait()阻塞等待条件变量满足 释放已经掌握的互斥锁,相当于cond.L.Unlock(),这两步是一个原子操作 当被唤醒时,Wait()函数解除阻塞,并重新获得互斥锁。相当于cond.L.Lock() 用于唤醒的两个方法 func (c *Cond) Signal() func (c *Cond) Broadcast() 条件变量与生产者消费者模型 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |